package com.atguigu.chapter11


object HighOrderFunDemo01 {
  def main(args: Array[String]): Unit = {
    //使用高阶函数
    val res = test(sum2, 3.5)
    println("res=" + res)
    //在scala中，可以把一个函数直接赋给一个变量,但是不执行函数,作为参数的时候可以不用空格_,但是如果是赋值则需要空格_
    val f1: () => Unit = myPrint _
    f1() //执行

    println(test333(myFunction, 10, 20))
    myFunction01(myPrint2, 10)
    test222(sayOK)
  }

  def myPrint(): Unit = {
    println("hello,world!")
  }

  def myPrint2(input: Int): Unit = {
    println("hello,world!" + input)
  }

  //说明
  //1. test就是一个高阶函数
  //2. f: Double => Double 表示一个函数， 该函数可以接受一个Double,返回Double
  //3. n1: Double 普通参数
  //4. f(n1) 在test函数中，执行 你传入的函数  f: (Double) => Double
  def test(f: Double => Double, n1: Double): Double = {
    f(n1)
  }

  //普通的函数, 可以接受一个Double,返回Double
  def sum2(d: Double): Double = {
    println("sum2被调用")
    d + d
  }

  def test333(f: (Double, Int) => Double, n1: Double, n2: Int): Double = {
    f(n1, n2)
  }

  def myFunction(n1: Double, n2: Int): Double = {
    n1 * n2
  }

  // 接收入参和返回都为空的函数
  def myFunction01(f: Int => Unit, n1: Int): Unit = {
    f(n1)
  }

  //说明test2是一个高阶函数，可以接受一个 没有输入，返回为Unit的函数
  def test222(f: () => Unit): Unit = {
    f()
  }

  def sayOK(): Unit = {
    println("sayOKKK...")
  }

  def sub(n1: Int): Unit = {
    print("传入参数为" + n1)
  }
}



